package books.borrowing;

import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import books.borrowing.bo.IAuthorManagerClientService;
import books.borrowing.bo.IBookBorrowingBo;
import books.borrowing.bo.IBookManagerClientService;
import books.borrowing.bo.ISubscriberBo;
import books.borrowing.entity.BookBorrowingEntity;
import books.borrowing.entity.SubscriberEntity;
import books.borrowing.util.EUserProfile;
import books.storage.service.AuthorDto;
import books.storage.service.BookDto;
import books.storage.service.LiteraryGenreDto;

public class AppClient {
	private static IBookManagerClientService _serviceBook;
	private static IAuthorManagerClientService _serviceAuthor;
	private static ISubscriberBo _serviceSubscriber;
	private static IBookBorrowingBo _serviceRent;

	public static void main(String[] args) throws Exception {
		
		EJBFacade.getInstance();
		_serviceBook = EJBFacade.getBooksManager();
		_serviceAuthor = EJBFacade.getAuthorManager();
		_serviceRent = EJBFacade.getBookBorrowingBo();
		_serviceSubscriber = EJBFacade.getSubscriberBo();

		/**
		 * Initialization
		 */

		// BooksManagerBeanService serviceB = new BooksManagerBeanService();
		// AuthorsManagerBeanService serviceA = new AuthorsManagerBeanService();
		//
		// System.out.println("service book : " +
		// serviceB.getServiceName().getNamespaceURI());
		// System.out.println("service author : " +
		// serviceA.getServiceName().getNamespaceURI());
		//
		// BooksManagerBean _book = serviceB.getBooksManagerBeanPort();
		// System.out.println("_book " + _book.toString());
		//
		// AuthorsManagerBean _author = serviceA.getAuthorsManagerBeanPort();
		// System.out.println("_author " + _author.toString());

		System.out.println("Test des fonctionnalités applicatives....");
		
		// TEST AJOUT D'UN NOUVEAU GENRE LITERRAIRE
		// /////////////////////////////////////////
		LiteraryGenreDto _newLG = new LiteraryGenreDto();
		_newLG.setDescription("musique pop/rock");
		_newLG.setWording("Musique");
		LiteraryGenreDto _generateLit = new LiteraryGenreDto();
		try {
			_generateLit = _serviceBook.addNewLiteraryGenreDto(_newLG);
			System.out.println("Nouveau genre ajouté : "
					+ _generateLit.getWording() + ", avec l'ID generé : "
					+ _generateLit.getId());
		} catch (Exception e) {
			System.out.println("Impossible d'ajouter le genre literaire '"
					+ _newLG.getDescription() + "'. Existe-il déja en base ?");
		}

		// MODIFICATION D'UN GENRE LITTERAIRE
		// /////////////////////////////////////////
		_generateLit.setDescription("musique electro");
		try {
			_generateLit = _serviceBook.updateLiteraryGenre(_generateLit);
			System.out.println("Le genre litteraire modifié а l'ID "
					+ _generateLit.getId()
					+ " a desormais la description "
					+ _serviceBook.findLiteraryGenreDto(_generateLit.getId())
							.getDescription());
		} catch (Exception e) {
			System.out
					.println("Impossible de mettre а jour le genre litteraire '"
							+ _generateLit.getDescription() + "'.");
		}

		// AJOUTER D'UN AUTEUR
		// //////////////////////
		AuthorDto _generateAut = new AuthorDto();
		GregorianCalendar _cal = new GregorianCalendar(1976, 11, 12);
		XMLGregorianCalendar xmlCalendar = DatatypeFactory.newInstance()
				.newXMLGregorianCalendar(_cal);
		AuthorDto _newAut = new AuthorDto();
		_newAut.setName("Stephen King");
		_newAut.setBirthday(xmlCalendar);

		try {
			_generateAut = _serviceAuthor.addNewAuthor(_newAut);
			System.out.println("L'auteur '" + _generateAut.getName()
					+ "' a été ajouté avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible d'ajouter l'auteur '"
					+ _generateAut.getName() + "'. Existe t(il déja en base ?");
		}

		// MODIFICATION D'UN AUTEUR
		// //////////////////////////
		_cal = new GregorianCalendar(1986, 04, 21);
		xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(
				_cal);
		_generateAut.setDeathday(xmlCalendar);
		try {
			_generateAut = _serviceAuthor.updateAuthor(_generateAut);
			System.out.println("L'auteur '"
					+ _serviceAuthor.findAuthor(_generateAut.getId()).getName()
					+ "' a été modifié avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible de modifier l'auteur '"
					+ _generateAut.getName() + "'.");
		}

		// AJOUT D'UN LIVRE
		// ///////////////////
		BookDto _generateBk = new BookDto();
		_cal = new GregorianCalendar(1986, 04, 18);
		xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(
				_cal);

		BookDto _newBook = new BookDto();
		_newBook.setAuthor(_generateAut);
		_newBook.setLiterary(_generateLit);
		_newBook.setTitle("Bazar");
		_newBook.setIsbn("5SQ6VSSQ89");
		_newBook.setEditionDate(xmlCalendar);

		try {
			_generateBk = _serviceBook.addNewBook(_newBook);
			System.out.println("Le livre '" + _generateBk.getTitle()
					+ "' a été ajouté en base avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible d'ajouter le livre '"
					+ _newBook.getTitle() + "'");
		}

		// GESTION DES UTILISATEURS
		// /////////////////////////

		SubscriberEntity _subscriber = new SubscriberEntity();
		_subscriber.setLogin("dmarie");
		_subscriber.setName("marie");
		_subscriber.setForename("dupont");
		_subscriber.setPassword("mypassword");
		_subscriber.setProfile(EUserProfile.SUBRENT_ADMIN);

		try {
			_serviceSubscriber.save(_subscriber);
			System.out.println("Inscription réussie !");
		} catch (Exception e) {
			System.out.println("Impossible d'ajouter l'utilisateur '"
					+ _subscriber.getName() + "'. Existe t-il deja en base ?");
		}

		// MODIFICATION D'UN LIVRE
		// //////////////////////////
		try {
			_serviceBook.addCopies(2, _generateBk);
			String title = _serviceBook.findBook(_generateBk.getIsbn())
					.getTitle();
			Integer count = _serviceBook.findBook(_generateBk.getIsbn())
					.getCopiesNumber();
			System.out.println("Le livre '" + title + "' compte desormais "
					+ count + " exemplaires en stock");
		} catch (Exception e) {
			System.out
					.println("Impossible de modifier le nombre d'exemplaires du livre '"
							+ _newBook.getTitle());
		}

		// EMPRUNT DU LIVRE
		// //////////////////
		BookBorrowingEntity _rent = null;
		try {
			_rent = _serviceRent.rentBook("dmarie", "5SQ6VSSQ89");
			System.out.println(_serviceBook.findBook("5SQ6VSSQ89")
					.getCopiesNumber());
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Erreur lors de l'emprunt");
		}
		
		// SUPPRESSION D'UN EMPRUNT
		/////////////////////////////
		try {
			if(_rent != null)
				_serviceRent.delete(_rent);
		} catch (Exception e) {
			System.out.println("Impossible de  supprimer le l'utilisateur");
		}
		
		/*
		// SUPPRESSION D'UN UTILISATEUR
		/////////////////////////////
		try {
			_serviceSubscriber.delete(_subscriber);
		} catch (Exception e) {
			System.out.println("Impossible de  supprimer le l'utilisateur");
		}
		*/
		// SUPPRESSION D'UN LIVRE
		// //////////////////////////
		try {
			_serviceBook.removeBook(_generateBk);
			System.out.println("Le livre '" + _generateBk.getTitle()
					+ "' a été supprimé avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible de  supprimer le livre");
		}

		// SUPPRESSION D'UN GENRE LITTERAIRE
		// ///////////////////////////////////
		try {
			_serviceBook.removeLiteraryGenre(_generateLit);
			System.out.println("Le genre literaire '"
					+ _generateLit.getDescription()
					+ "' a été supprimé avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible de supprimer le genre literaire");
		}

		// SUPPRESSION D'UN AUTEUR
		// //////////////////////////
		try {
			_serviceAuthor.removeAuthor(_generateAut);
			System.out.println("L'auteur '" + _generateAut.getName()
					+ "' a été supprimé avec succиs");
		} catch (Exception e) {
			System.out.println("Impossible de supprimer l'auteur");
		}

	}
}
